package Servlets;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
import com.akcess.exception.RolException;
import com.akcess.exception.Usuario_tiene_rolException;
import com.akcess.exception.UsuariosException;
import java.io.*;
import java.net.*;
import java.util.*;
import com.akcess.vo.*;
import manejadores.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

/**
 *
 * @author Alejandro
 */
public class GestionarUsuarios extends HttpServlet {

    private static final String dirBASE = "jsp/Usuarios";

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
//            out.println("<html>");
//            out.println("<head>");
//            out.println("<title>Servlet GestionarUsuarios</title>");
//            out.println("</head>");
//            out.println("<body>");
//            out.println("<h1>Servlet GestionarUsuarios at " + request.getContextPath() + "</h1>");
//            out.println("</body>");
//            out.println("</html>");

        } finally {
            out.close();
        }
    }

    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {

        String accion = request.getParameter("hacer");
        request.setAttribute("modulo", "Usuarios");
        //Saco el parametro id, del request, para la parte de editar y borrar
        int id = 0;
        try {
            id = Integer.parseInt(request.getParameter("id"));
        } catch (NumberFormatException e) {
        }
        try {

            if (accion.equals("Asignar_Rol")) {
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/ListarAsignarRol.jsp");
                dispatcher.forward(request, response);

            }
            if (accion.equals("opCambiar")) {
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/AsignarRol.jsp");
                dispatcher.forward(request, response);

            }

            if (accion.equals("Agregar")) {
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/AgregarUsuario.jsp");
                dispatcher.forward(request, response);

            }
            if (accion.equals("Ver")) {
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/VerUsuario.jsp");
                dispatcher.forward(request, response);
            }
            if (accion.equals("Borrar")) {
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/ListarBorrarUsuario.jsp");
                dispatcher.forward(request, response);
            }
            if (accion.equals("Modificar")) {
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/ListarModificarUsuario.jsp");
                dispatcher.forward(request, response);
            }
            if (accion.equals("opModificar")) {
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/ModificarUsuario.jsp");
                dispatcher.forward(request, response);
            }
            if (accion.equals("modificacion")) {
                this.ModificarUsuario(request, response);
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/ListarModificarUsuario.jsp");
                dispatcher.forward(request, response);
            }
            if (accion.equals("Listar")) {
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/listarUsuarios.jsp");
                dispatcher.forward(request, response);
            } else if (accion.equals("opBorrar")) {
                HttpSession session = request.getSession(false);
                Connection cone;
                cone = (Connection) session.getAttribute("conexion");
                Usuarios user = (Usuarios) session.getAttribute("datosUser");
                ManejadorUsuarios manejador = new ManejadorUsuarios(cone);
                manejador.BorrarUsuarios(id, user.getId_usuario());
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/ListarBorrarUsuario.jsp");
                dispatcher.forward(request, response);

            } else if (accion.equals("modificacion")) {
                this.ModificarUsuario(request, response);
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/ListarModificarUsuario.jsp");
                dispatcher.forward(request, response);
            } else if (accion.equals("modificarRol")) {
                this.ModificarRol(request, response);
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/ListarAsignarRol.jsp");
                dispatcher.forward(request, response);
            } else if (accion.equals("agregacion")) {
                String mensaje = this.AgregarUsuario(request, response);
                if (mensaje != null) {
                    request.setAttribute("Error", mensaje);
                    RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/listarUsuarios.jsp");
                    dispatcher.forward(request, response);
                } else {
                    request.setAttribute("Error", "Algo no anda...");
                    RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/listarUsuarios.jsp");
                    dispatcher.forward(request, response);
                }
                
            }

            if (accion.equals("opReset")) {
                if (this.ResetPassword(request, response)) {
                    request.setAttribute("Mensaje", "La contraseña fue reseteada exitosamente...");
                    RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/ListarModificarUsuario.jsp");
                    dispatcher.forward(request, response);
                } else {
                    request.setAttribute("Mensaje", "La contraseña no pudo ser reseteada...");
                    RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/ListarModificarUsuario.jsp");
                    dispatcher.forward(request, response);
                }
            }
            if (accion.equals("consultarNameOp")) {
                response.setContentType("text/html;charset=UTF-8");
                PrintWriter out = response.getWriter();
                try {
                    if (this.consultaNameOp(request, response)) {
                        out.print("SI");
                    } else {
                        out.print("NO");
                    }
                } finally {
                    out.close();
                }
            }
            if (accion.equals("traerSolicitante")) {
                response.setContentType("text/html;charset=UTF-8");
                PrintWriter out = response.getWriter();
                try {
                    String cadena=this.traerReservador(request, response);
                    out.print(cadena);
                } finally {
                    out.close();
                }
            }

        } catch (Exception ex) {
            try {
                this.sendErrorRedirect(request, response, "jsp/errores/errorGenerico.jsp", ex);
            } catch (Exception e) {
                e.printStackTrace();
            }

        }

    }

    /** 
     * Handles the HTTP <code>POST</code> method. Y reenvia todo al get.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) {

        try {
            this.doGet(request, response);


        } catch (Exception ex) {
            try {
                this.sendErrorRedirect(request, response, "jsp/errores/errorGenerico.jsp", ex);
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }

    /** 
     * Returns a short description of the servlet.
     */
    public String getServletInfo() {
        return "Short description";
    }
/**
 * Saca todos los campos del request y lo mete en un objeto usuario para luego enviar el objeto 
 * al manejador que es el que se encarga de realizar las operaciones en la base de datos.
 * @param request Contiene todos los datos del usuario nuevo creado.
 * @param response
 * @return Un string que contiene el mensaje de exito o fracaso resultado del agregado del usuario.
 * @throws java.lang.Exception
 */
    protected String AgregarUsuario(HttpServletRequest request, HttpServletResponse response) throws Exception {

        //Creo un maneajador de usuarios y de roles, para luego agregar el Usuario al BD otraer los roles de BD
        Vector RolesUser = new Vector();
        String mensaje=null;
        ManejadorUsuarios manejadorUser = null;
        NombresModulosOperaciones[] permisos;
        ManejadorRol manejaRoles;
        Rol[] todosLosRoles = null;
        HttpSession session = request.getSession(false);
        Connection cone;
        Usuarios user = null;
        if (session != null) {
            cone = (Connection) session.getAttribute("conexion");
            user = (Usuarios) session.getAttribute("datosUser");
            if (cone != null) {
                manejadorUser = new ManejadorUsuarios(cone);
                manejaRoles = new ManejadorRol(cone);
                todosLosRoles = manejaRoles.ListarRoles();
            }

        }

        //Saco los datos del formulario
        int idtipodoc = Integer.parseInt(request.getParameter("idtipodoc"));
        String nrodoc = request.getParameter("Numero_de_Documento");
        String nombre = request.getParameter("Nombre");
        String apellido = request.getParameter("Apellido");
        String nombreoperativo = request.getParameter("Nombre_Operativo");
        String contrasena = request.getParameter("Contrasenha");
        String direccion = request.getParameter("Direccion");
        String telefono = request.getParameter("Telefono");
        String celular = request.getParameter("Celular");
        String fax = request.getParameter("Fax");
        String observacion = request.getParameter("Observacion");
        String email = request.getParameter("Email");

        if (todosLosRoles != null && manejadorUser != null) {
            for (int i = 0; i < todosLosRoles.length; i++) {
                //El usuario tiene por defecto el rol de solicitante.
                if (todosLosRoles[i].getNombre().equalsIgnoreCase("Solicitante")) {
                    RolesUser.add(todosLosRoles[i]);
                }

            }

            //Creo el nuevo usuario
            Usuarios usuario = new Usuarios();
            usuario.setIdtipodoc(idtipodoc);
            usuario.setNrodoc(nrodoc);
            usuario.setNombre(nombre);
            usuario.setApellido(apellido);
            usuario.setNombreoperativo(nombreoperativo);
            usuario.setContrasena(contrasena);
            usuario.setDireccion(direccion);
            usuario.setTelefono(telefono);
            usuario.setCelular(celular);
            usuario.setFax(fax);
            usuario.setObservacion(observacion);
            usuario.setEmail(email);
            usuario.setId_operador(user.getId_usuario());
            //Agrego los roles al usuario .
            usuario.setRoles(RolesUser);

            //Agrego el usuario a la Base de Datos
            boolean exito=manejadorUser.AgregarUsuario(usuario);
            
            if (!exito) {
                     mensaje = manejadorUser.getMensajeProblem();
            } else {
                    mensaje = "El usuario fue agregado con EXITO..";
            }
           
        }
        return mensaje;
    //Seria bueno lanzar una exception aca si es que hay algun error.         
    }
/**
 * Reenvia la excepion ocurrida en alguna parte del programa del sistema a una pagina presentada con el formato
 * de la pagina.
 * @param request
 * @param response
 * @param errorPageURL Define el url de la pagina que mostrara el mensaje del error
 * @param e
 * @throws javax.servlet.ServletException
 * @throws java.io.IOException
 */
    public static void sendErrorRedirect(HttpServletRequest request,
            HttpServletResponse response, String errorPageURL,
            Throwable e)
            throws ServletException, IOException {
        request.setAttribute("javax.servlet.jsp.jspException", e);
        RequestDispatcher dispatcher = request.getRequestDispatcher(errorPageURL);
        dispatcher.forward(request, response);

    }
/**
 * Modifica los roles que son asignados a un usuario determinado. La operacion de asignar rol utiliza esta funcion.
 * @param request Contiene el id del usuario al cual se le quiere modificar sus roles asignados y los roles que se le desea asignar.
 * @param response
 * @throws javax.servlet.ServletException
 * @throws java.io.IOException
 */
    protected void ModificarRol(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            int idUser = Integer.parseInt(request.getParameter("id"));
            Vector roles = new Vector();


            HttpSession session = request.getSession(false);
            if (session != null) {
                Connection cone;
                cone = (Connection) session.getAttribute("conexion");

                if (cone != null) {
                    ManejadorRol manejarRol = new ManejadorRol(cone);
                    Rol[] todosRoles = manejarRol.ListarRoles();
                    for (int i = 0; i < todosRoles.length; i++) {
                        if (Boolean.parseBoolean(request.getParameter(todosRoles[i].getNombre()))) {
                            roles.add(todosRoles[i]);
                        }
                    }
                    ManejadorUsuarios manejadorUser = new ManejadorUsuarios(cone);
                    manejadorUser.ModificarRol(idUser, roles);

                }
            }
        } catch (RolException ex) {
            ex.printStackTrace();
        } catch (Usuario_tiene_rolException ex) {
            ex.printStackTrace();
        }
    }
/**
 * Obtenemos los campos del formulario y llenamos un objeto usuario con los datos correspondientes para
 * luego enviarle al manejador correspondiente.
 * @param request Contiene los campos del usuario modificado y el id del usuario a modificar.
 * @param response
 * @throws javax.servlet.ServletException
 * @throws java.io.IOException
 */
    protected void ModificarUsuario(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            int idUser = Integer.parseInt(request.getParameter("id"));
            String nrodoc = request.getParameter("NroDoc");
            String nombre = request.getParameter("Nombre");
            String apellido = request.getParameter("Apellido");
            String nombreoperativo = request.getParameter("NombreOperativo");
            String direccion = request.getParameter("Direccion");
            String telefono = request.getParameter("Telefono");
            String celular = request.getParameter("Celular");
            String fax = request.getParameter("Fax");
            String observacion = request.getParameter("Observacion");
            String email = request.getParameter("Email");

            Usuarios usuario = new Usuarios();
            usuario.setNrodoc(nrodoc);
            usuario.setNombre(nombre);
            usuario.setApellido(apellido);
            usuario.setNombreoperativo(nombreoperativo);
            usuario.setDireccion(direccion);
            usuario.setTelefono(telefono);
            usuario.setCelular(celular);
            usuario.setFax(fax);
            usuario.setObservacion(observacion);
            usuario.setEmail(email);
            Usuarios user = null;

            HttpSession session = request.getSession(false);
            if (session != null) {
                Connection cone;
                cone = (Connection) session.getAttribute("conexion");
                user = (Usuarios) session.getAttribute("datosUser");
                if (cone != null) {
                    usuario.setId_operador(user.getId_usuario());
                    ManejadorUsuarios manejadorUser = new ManejadorUsuarios(cone);
                    manejadorUser.ModificarUsuario(idUser, usuario, false);
                }
            }
        } catch (UsuariosException ex) {
            ex.printStackTrace();
        }
    }

    /**
     * Realiza el reseteo de la contraseña de un usuario determinado.
     * @param request Recibe la solicitud que contiene el id del usuario al cual se le cambiara la contraseña.
     * @param response
     * @throws javax.servlet.ServletException
     * @throws java.io.IOException
     */
    protected boolean ResetPassword(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            int idUser = Integer.parseInt(request.getParameter("id"));

            Usuarios user = null;

            HttpSession session = request.getSession(false);
            if (session != null) {
                Connection cone;
                cone = (Connection) session.getAttribute("conexion");
                user = (Usuarios) session.getAttribute("datosUser");
                if (cone != null) {
                    ManejadorUsuarios manejadorUser = new ManejadorUsuarios(cone);
                    manejadorUser.ResetPassword(user.getId_usuario(), idUser);
                    return true;
                }
            }
            return false;
        } catch (UsuariosException ex) {
            return false;
        }
    }
    /**
     * Obtenemos el nombre operativo del request para luego por medio del manejador consultar su
     * disponibilidad. Esta funcion es utiliza por la funcion AJAX
     * @param request Contiene el nombre operativo que queremos consultar su disponibilidad.
     * @param response
     * @return Retorna TRUE si el nombres esta disponible y FALSE si no lo esta.
     * @throws com.akcess.exception.UsuariosException
     */
    protected boolean consultaNameOp(HttpServletRequest request, HttpServletResponse response) throws UsuariosException{
        
            String idUser = request.getParameter("nombreOp");
            HttpSession session = request.getSession(false);
            if (session != null) {
                Connection cone;
                cone = (Connection) session.getAttribute("conexion");
                if (cone != null) {
                    ManejadorUsuarios manejadorUser = new ManejadorUsuarios(cone);
                    return manejadorUser.NombreOperativoDisponible(idUser);
                    
                }
            }
            return false;
        
    }
    /**
     * Busca los datos del usuario que quiere realizar una reserva en el caso de que exista
     * o de que tenga el permiso. Usuario no puede agregar una reserva para SI MISMO, asi que
     * en esta parte tambien prevemos el caso que un usuario quiera realizar una reserva para 
     * si mismo.
     * @param request
     * @param response
     * @return Los datos formateados en HTML del reservador.
     * @throws com.akcess.exception.RolException En el caso que no se pueda consultar la tabla de roles.
     */
    protected String traerReservador(HttpServletRequest request, HttpServletResponse response) throws RolException{
        
            String idUser = request.getParameter("nombreOp");
            String resultado=null;
            HttpSession session = request.getSession(false);
            if (session != null) {
                Connection cone;
                cone = (Connection) session.getAttribute("conexion");
                Usuarios user = (Usuarios) session.getAttribute("datosUser");
                if (cone != null) {
                    //Este if esta por el caso que un operador quiera hacer una reserva para si mismo.
                    if(user.getNombreoperativo().equals(idUser))
                    {
                        resultado="Op==Sol";
                    }else
                    {
                        ManejadorUsuarios manejadorUser = new ManejadorUsuarios(cone);
                        Usuarios solic= manejadorUser.traerUsuarioXnombreOp(idUser);
                        if(solic==null)
                            //Entra aca si es que no encuentra a ningun usuario con ese nombre operativo.
                            resultado="NoHay";
                        else
                        {
                            //Vemos si el usuario tiene el permiso para hacer una reserva.
                            NombresModulosOperaciones[] permisos = manejadorUser.BuscarPermisosDeUser(solic);
                            boolean tienePermiso=false;
                            for (int i = 0; i < permisos.length; i++) {
                                NombresModulosOperaciones p = permisos[i];
                                //El modulo 4, es el modulo de "Solicitud de Reserva"
                                if(p.getId_modulo()==4)
                                {
                                    //La operacion 1, es la opeacion de "Agregar"
                                    if(p.getId_permiso()==1)
                                        tienePermiso=true;
                                }
                                
                            }
                            //Si puede agregar una Solicitud de Reserva entonces tiene permiso.
                            if(tienePermiso)
                            {
                                
                                resultado="<input type=\"hidden\" name=\"" + "idReservador" + "\" value=\""+solic.getId_usuario()+"\">" +
                                        "<p><b>Nombre:</b> "+solic.getNombre()+" "+solic.getApellido()+"<br> "+ 
                                        "<b>Nombre Operativo:</b> "+solic.getNombreoperativo()+"<br>" +
                                        "<b>Documento Nº:</b>"+solic.getNrodoc()+"<br></p>";
                            }
                                
                            else
                                resultado="NoHay";
                        }
                            
                    }
                    
                }
            }
            return resultado;
        
    }
    
}
